#include "worker.h"

Worker::Worker()
{
    this->db_helper = new DbHelper();
}

void Worker::run()
{
    this->showInfo();
    this->showRozpodil();
    this->showLastYearsRodove();
    this->showYearDiff();
    this->showToFile();
}


void Worker::showInfo(){
    string task = "Задача 3. Видобути інформацію, де відібрати дані для виведення інформації.";
    vector<Rodove> arr = this->db_helper->select();

    this->writeData(task, arr, false);
}

void Worker::showRozpodil() {
        string task = "Задача 4. Вивести інформацію про розподіл кількості родовищ в областях за типом родовища. Навпроти назв регіонів і областей, розділених комами, установити значення кількості для кожного типу родовища. Передбачити підсумки по вертикалі і по горизонталі. До заголовка звіту додати слова “станом на ” і встановити поточну дату.";
        vector<Rodove> arr = this->db_helper->select();



        task.append("\nСтаном на :" + cur_day + "." + cur_month + "." + cur_year);
        cout<<task<<endl;

        std::set<string> oblast;

        for(vector<Rodove>::iterator it = arr.begin(); it<arr.end(); it++){
            Rodove item = *it;
            oblast.insert(item.getOblast());
        }

        for(std::set<string>::iterator it = oblast.begin(); it.operator !=(oblast.end()); it++){

            string oblast_name = *it;

            std::map<string, int>  type_arr;
            type_arr.clear();

            type_arr["Нафтове"] = 0;
            type_arr["Газове"] = 0;
            type_arr["Нафтогазове"] = 0;
            type_arr["Нафтогазоконденсатне"] = 0;
            type_arr["Газоконденсатне"] = 0;

            std::set<string> region;
            for(vector<Rodove>::iterator it2 = arr.begin(); it2 != arr.end(); it2++){
                Rodove item = *it2;

                // check if current 'oblast'
                if(oblast_name == item.getOblast()){
                    type_arr[item.getType()]++;

                    //set region
                    region.insert(item.getRegion());
                }
            }

            cout<<endl<<"Область:"<<oblast_name<<", регіони:";

            for (std::set<string>::iterator iter_reg = region.begin(); iter_reg != region.end(); iter_reg++) {
                string region_name = *iter_reg;
                cout<<region_name;
            }
            cout<<endl;

            for(std::map<string, int>::iterator iter_type = type_arr.begin(); iter_type != type_arr.end(); iter_type++ ){
                cout<<(iter_type->first)<<" = "<< type_arr[iter_type->first]<<endl;
            }
        }

    }

void Worker::showLastYearsRodove(){
    string task = "Задача 5. Обчислити залежність, відобразити динаміку відкриття нових родовищ (кількість) по Україні протягом останніх восьми років.\n Задача 8. Виготовити консольний екранний блок зі всіма відомостями про родовища, передбачити видачу відповідних повідомлень для старих родовищ, відкритих 10 і більше років тому. Вказати назви регіонів і областей.";

    vector<Rodove> arr = this->db_helper->selectYearAfter(30);
    this->writeData(task, arr, false);
}

void Worker::showYearDiff(){
    string task = "Задача 6. Вивести інформацію з відомостями про родовища, куди внести назви регіонів, назви родовищ та різницю в роках між моментом відкриття і введення в розробку. Відібрати лише нафтогазові родовища. До заголовка виведення інформацію додати слова “станом на ” і встановити поточну дату. Підсумувати різницю в роках для регіонів і для всього звіту. \nЗадача 9. Скласти програму для видачі інформації за умовою задачі 6. , яка запускає видачу інформації з консольного інтерфейсу, забезпечити видачу інформації: виготовленого майстром і програмою.";

            task.append("\nСтаном на :" + cur_day + "." + cur_month + "." + cur_year);

            vector<Rodove> arr = this->db_helper->select();
            vector<Rodove> new_arr;

            int year_sum_reg = 0;
            int year_sum_all = 0;

            for(vector<Rodove>::iterator it = arr.begin(); it < arr.end(); it++){
                Rodove item = *it;
                int year_diff = item.getYear_used() - item.getYear_start();

                year_sum_all += year_diff;
                if (item.getType() == "Нафтогазове") {
                    year_sum_reg += year_diff;

                    item.setYear_used(year_diff);
                    new_arr.push_back(item);
                }
            }

            std::stringstream year_sum_reg_str;
            year_sum_reg_str<<year_sum_reg;

            std::stringstream year_sum_all_str;
            year_sum_all_str<<year_sum_all;

            task.append("\nСума різниці в роках для регіонів: " + year_sum_reg_str.str());
            task.append("\nСума різниці в роках для всього звіту: " + year_sum_all_str.str());

            this->writeData(task, new_arr, false);
}

void Worker::showToFile(){
    string task = "Задача 7. Виготовити консольний інтерфейс для перегляду вмісту всіх структур з даними та доповнення початкового файлу відомостями про нові родовища. Забезпечити запуск виведення інформації та внесення в файл.";
    vector<Rodove> arr = this->db_helper->select();
    this->writeData(task, arr, true);
}

void Worker::writeData(string task, vector<Rodove> arr, bool PrintStream){
    //write to file
    if(PrintStream){
        freopen("data.csv","w",stdout);
    }

    cout<<task<<endl;

    for(vector<Rodove>::iterator it = arr.begin(); it!= arr.end(); ++it){


        Rodove item = *it;

        std::stringstream year_start;
        year_start<<item.getYear_start();

        std::stringstream year_used;
        year_used<<item.getYear_used();

        string ready = "";
        ready.append(item.getName()+ ";" + item.getOblast() + "; "
                     + item.getRegion() + ";" + item.getPlace() + "; "
                     + item.getType() + ";" + item.getGas_size() + "; "
                     + item.getOil_size() + "; " + year_start.str() + "; "
                     + year_used.str() + "; " + item.getSkhema());
        cout<<ready<<endl;

        cout<<"###################################################"<<endl;
    }

 }




